home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utildsk / mcdplayr.lha / MCDPlayer2 / Source / scsistuff.h < prev    next >
C/C++ Source or Header  |  1996-05-17  |  14KB  |  546 lines

  1. char *version = "\0$VER: MCDPlayer " VERSION " (" __DATE__ " " __TIME__ ")";
  2.  
  3. UBYTE *scsi_data = NULL;
  4. UBYTE *toc_buf = NULL;
  5.  
  6. int NewTimer = -1;
  7.  
  8. char  scsi_dev[32];
  9. int    scsi_id = 1;
  10.  
  11. UBYTE buffer[LINE_BUF];
  12.  
  13. int   ActStat = 0;   /* 0=No Disk; 1=Playing; 2=Stopped; 3=Paused; 4=Datadisk */
  14. int   ActTitle = 0;
  15. int   ActProg = 0;   /* -1=No Prog; 0=Default Prog; 1-3=other Progs */
  16. int   ActProgTitle = 0;
  17.  
  18. char  SetNextTitle = 0;
  19. char  InputTitleStat = 0; /* 0: direkte Titelwahl, 1: Zehnerstelle, 2: Einerstelle */
  20. int   InputTitle = 0;
  21.  
  22. MSGPORT *mp_ptr;
  23. IOSTDREQ *io_ptr;
  24. SCSICMD scsi_cmd;
  25. UBYTE *scsi_sense;
  26.  
  27. UBYTE TOC_NumTracks = 0;
  28. UBYTE TOC_Flags[100]; /* 0=Musik, 1=Daten */
  29. ULONG TOC_Addr[100];
  30. char *TOC_Title[100];
  31. char *TOC_CDTitle;
  32. char *TOC_CDInterpret;
  33. char  TOC_TitleStrs[4000];
  34. char  TOC_CDID[20];
  35.  
  36. char WndPosition = 0;
  37. int  Wnd_X = -1;
  38. int  Wnd_Y = -1;
  39.  
  40. char SongPath[128];
  41.  
  42. struct timerequest *TimerIO = NULL;
  43. struct MsgPort     *TimerMP = NULL;
  44. struct MsgPort     *BrokerMP = NULL;
  45. struct DiskObject  *DObj=NULL;
  46. struct Library     *CxBase= NULL;
  47.  
  48. CxObj *broker=NULL, *filter[17], *sender[17], *translate[17];
  49. struct NewBroker newbroker =
  50.      { NB_VERSION,
  51.        "MCDP",
  52.        "MultiCDPlayer, ©1994 Boris Jakubaschk",
  53.        "Player for audio CDs in a CDROM drive",
  54.        NBU_UNIQUE | NBU_NOTIFY,
  55.        NULL,
  56.        0, 0, 0 };
  57. ULONG cxsigflag;
  58.  
  59.  
  60. int TimerInit()
  61.     {
  62.     if (TimerMP = CreatePort(0,0))
  63.         {
  64.         if (TimerIO = (struct timerequest *) CreateExtIO(TimerMP, sizeof(struct timerequest)))
  65.             {
  66.             if (OpenDevice( TIMERNAME, UNIT_VBLANK, (struct IORequest *)TimerIO, 0L)==NULL)
  67.                 {
  68.                 return( 1 );
  69.                 }
  70.             else
  71.                 {
  72.                 ErrorMsg("Can't open timer.device.");
  73.                 }
  74.             }
  75.         else
  76.             {
  77.             ErrorMsg( "CreateExtIO failed." );
  78.             }
  79.         }
  80.     else
  81.         {
  82.         ErrorMsg("CreatePort failed.");
  83.         }
  84.     return( 0 );
  85.     }
  86.  
  87. void TimerExit()
  88.     {
  89.     if (TimerIO)
  90.         {
  91.         CloseDevice((struct IORequest *)TimerIO);
  92.         DeleteExtIO((struct IORequest *)TimerIO);
  93.         };
  94.     if (TimerMP)
  95.         {
  96.         DeletePort(TimerMP);
  97.         };
  98.     }
  99.  
  100. int DoScsiCmd (UBYTE * data, int datasize, UBYTE * cmd, int cmdsize, UBYTE flags)
  101.     {
  102.     io_ptr->io_Length = sizeof (SCSICMD);
  103.     io_ptr->io_Data = (APTR) & scsi_cmd;
  104.     io_ptr->io_Command = HD_SCSICMD;
  105.  
  106.     scsi_cmd.scsi_Data = (APTR) data;
  107.     scsi_cmd.scsi_Length = datasize;
  108.     scsi_cmd.scsi_SenseActual = 0;
  109.     scsi_cmd.scsi_SenseData = scsi_sense;
  110.     scsi_cmd.scsi_SenseLength = SENSE_LEN;
  111.     scsi_cmd.scsi_Command = cmd;
  112.     scsi_cmd.scsi_CmdLength = cmdsize;
  113.     scsi_cmd.scsi_Flags = flags;
  114.  
  115.     (void) DoIO ((struct IORequest *) io_ptr);
  116.  
  117.     return (io_ptr->io_Error);
  118.     }
  119.  
  120. char SCMD_Inquiry ( void )
  121.     {
  122.     static SCSICMD6 command =
  123.         {
  124.         SCSI_CMD_INQ,
  125.         PAD,
  126.         PAD,
  127.         PAD,
  128.         0,
  129.         PAD
  130.         };
  131.     static int err;
  132.  
  133.     command.b4 = MAX_DATA_LEN;
  134.  
  135.     if ((err = DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
  136.                           (UBYTE *) & command, sizeof (command),
  137.                           (SCSIF_READ | SCSIF_AUTOSENSE))) == 0)
  138.         {
  139.         return ((scsi_data[0] & 0x1F)==0x05);
  140.         }
  141.     return( FALSE );
  142.     }
  143.  
  144. void SCMD_PlayAudio (int starttrack)
  145.     {
  146.     static SCSICMD12 command =
  147.         {
  148.         SCSI_CMD_PLAYAUDIO12,
  149.         PAD,
  150.         0, 0, 0, 0,
  151.         0, 0, 0, 0,
  152.         PAD,
  153.         PAD,
  154.         };
  155.  
  156.     int   i = 1;
  157.     ULONG Addr;
  158.  
  159.     SetNextTitle = 0;
  160.  
  161.     if (ActProg != -1)
  162.         {
  163.         if (Program[0][ActProg]!=0)
  164.             {
  165.             while ( (i<starttrack) && (Program[i-1][ActProg]!=0) ) i++;
  166.             ActProgTitle = i;
  167.             starttrack = Program[i-1][ActProg];
  168.             }
  169.         else ActProg = -1;
  170.         }
  171.  
  172.     DrawPrgmSymb( (ActProg!=-1)?1:0 );
  173.  
  174.     while( (TOC_Flags[starttrack-1]==1)&&(starttrack<TOC_NumTracks) ) starttrack++;
  175.  
  176.     Addr = TOC_Addr[starttrack-1]+1;
  177.  
  178.     command.b2 = (Addr&0xFF000000)>>24;
  179.     command.b3 = (Addr&0x00FF0000)>>16;
  180.     command.b4 = (Addr&0x0000FF00)>>8;
  181.     command.b5 = (Addr&0x000000FF);
  182.  
  183.     if (ActProg == -1)
  184.         {
  185.         Addr = TOC_Addr[TOC_NumTracks]-TOC_Addr[starttrack-1]-1;
  186.         }
  187.     else Addr = TOC_Addr[starttrack]-TOC_Addr[starttrack-1]-1;
  188.  
  189.     command.b6 = (Addr&0xFF000000)>>24;
  190.     command.b7 = (Addr&0x00FF0000)>>16;
  191.     command.b8 = (Addr&0x0000FF00)>>8;
  192.     command.b9 = (Addr&0x000000FF);
  193.  
  194.     DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
  195.                (UBYTE *) & command, sizeof (command),
  196.                (SCSIF_READ | SCSIF_AUTOSENSE));
  197.     };
  198.  
  199. void SCMD_PauseResume( void )
  200.     {
  201.     static SCSICMD10 command =
  202.         {
  203.         SCSI_CMD_PAUSERESUME,
  204.         PAD,
  205.         0,
  206.         0,
  207.         0,
  208.         0,
  209.         0,
  210.         0,
  211.         0,
  212.         PAD,
  213.         };
  214.  
  215.     command.b8 = (ActStat==1)?0x00:0x01;
  216.  
  217.     DoScsiCmd (0, 0,
  218.           (UBYTE *) & command, sizeof (command),
  219.           (SCSIF_READ | SCSIF_AUTOSENSE));
  220.     DrawPrgmSymb( (ActStat==1)?3:1 );
  221.     }
  222.  
  223. void SCMD_Eject( void )
  224.     {
  225.     static SCSICMD6 command =
  226.         {
  227.         SCSI_CMD_SSU,
  228.         0,
  229.         PAD,
  230.         PAD,
  231.         0,
  232.         PAD,
  233.         };
  234.  
  235.     int err;
  236.  
  237.     command.b4 = 2;
  238.  
  239.     if ((err = DoScsiCmd (0, 0,
  240.          (UBYTE *) & command, sizeof (command),
  241.          (SCSIF_READ | SCSIF_AUTOSENSE))) != 0)
  242.         {
  243.         return;
  244.         }
  245.     }
  246.  
  247. void SCMD_Stop( void )
  248.     {
  249.     static SCSICMD12 command =
  250.         {
  251.         SCSI_CMD_RZU,
  252.         0 ,
  253.         0 ,
  254.         0 ,
  255.         0 ,
  256.         0 ,
  257.         0 ,
  258.         0 ,
  259.         0 ,
  260.         0 ,
  261.         0 ,
  262.         0 ,
  263.         };
  264.  
  265. /*    command.b4 = 2; */
  266.  
  267.     DoScsiCmd (0, 0,
  268.           (UBYTE *) & command, sizeof (command),
  269.           (SCSIF_READ | SCSIF_AUTOSENSE));
  270.  
  271.     DrawPrgmSymb( 0 );
  272.     ActProg = -1;
  273.     SetDispStat();
  274.     }
  275.  
  276. void SCMD_SetVolume (int vol0, int vol1, int vol2, int vol3)
  277.     {
  278.     static int err, i, j;
  279.     static SCSICMD6 modecommand;
  280.     static struct volmodedata
  281.         {
  282.         UBYTE head[4];
  283.         UBYTE page;  /* page code 0x0E */
  284.         UBYTE plength;  /* page length */
  285.         UBYTE b2;    /* bit 2: Immed, bit 1: SOTC */
  286.         UBYTE b3;    /* reserved */
  287.         UBYTE b4;    /* reserved */
  288.         UBYTE b5;    /* bit 7: APRVal, bit 3-0: format of LBAs / Sec. */
  289.         UWORD bps;   /* logical blocks per second audio playback */
  290.         UBYTE out0;  /* lower 4 bits: output port 0 channel selection */
  291.         UBYTE vol0;  /* output port 0 volume */
  292.         UBYTE out1;  /* lower 4 bits: output port 1 channel selection */
  293.         UBYTE vol1;  /* output port 1 volume */
  294.         UBYTE out2;  /* lower 4 bits: output port 2 channel selection */
  295.         UBYTE vol2;  /* output port 2 volume */
  296.         UBYTE out3;  /* lower 4 bits: output port 3 channel selection */
  297.         UBYTE vol3;  /* output port 3 volume */
  298.         } modedata;
  299.  
  300.     for (i = 0; i < 4; i++)
  301.         modedata.head[i] = 0;
  302.  
  303.     modecommand.opcode  = SCSI_CMD_MSE;
  304.     modecommand.b1   = 0;
  305.     modecommand.b2   = 0x0E;
  306.     modecommand.b3   = 0;
  307.     modecommand.b4   = MAX_DATA_LEN;
  308.     modecommand.control = 0;
  309.  
  310.     if ((err = DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
  311.                           (UBYTE *) &modecommand, sizeof (modecommand),
  312.                           (SCSIF_READ | SCSIF_AUTOSENSE))) != 0)
  313.         return;
  314.  
  315.     for (j = (scsi_data[0]+1), i = scsi_data[3] + 4; i < j; i += scsi_data[i+1] + 2)
  316.         {
  317.         memcpy (&modedata.page, &scsi_data[i], 16);
  318.         }
  319.  
  320.     if (vol0 > -1 || vol1 > -1 || vol2 > -1 || vol3 > -1)
  321.         {
  322.         modedata.page = 0x0e;
  323.         modedata.plength = 0x0e;
  324.  
  325.         if (vol0 >= 0)
  326.             modedata.vol0 = vol0;
  327.         if (vol1 >= 0)
  328.             modedata.vol1 = vol1;
  329.         if (vol2 >= 0)
  330.             modedata.vol2 = vol2;
  331.         if (vol3 >= 0)
  332.             modedata.vol3 = vol3;
  333.  
  334.         modecommand.opcode = SCSI_CMD_MSL;
  335.         modecommand.b1     = 0x10;
  336.         modecommand.b2     = 0;
  337.         modecommand.b3     = 0;
  338.         modecommand.b4     = sizeof (modedata);
  339.         modecommand.control   = 0;
  340.  
  341.         if ((err = DoScsiCmd ((UBYTE *) &modedata, sizeof(modedata),
  342.                               (UBYTE *) &modecommand, sizeof (modecommand),
  343.                               (SCSIF_WRITE | SCSIF_AUTOSENSE))) != 0)
  344.             return;
  345.         }
  346.     }
  347.  
  348. char *GetNextStr( char *a )
  349.     {
  350.     char *b;
  351.  
  352.     b = a;
  353.     while( *b!='\n' ) b++;
  354.     *b = '\0';
  355.     return( b+1 );
  356.     }
  357.  
  358. void ShowCDTitle( void )
  359.     {
  360.     int slen;
  361.  
  362.     SetAPen( MainWnd->RPort, 1 );
  363.     RectFill( MainWnd->RPort, 25, 38+offy, 258, 64+offy );
  364.     SetAPen( MainWnd->RPort, 2 );
  365.     SetBPen( MainWnd->RPort, 1 );
  366.     Move( MainWnd->RPort, 25, 50+offy );
  367.     slen = strlen(TOC_CDInterpret);
  368.     Text( MainWnd->RPort, TOC_CDInterpret, (slen>29)? 29:slen );
  369.     Move( MainWnd->RPort, 25, 61+offy );
  370.     slen = strlen(TOC_CDTitle);
  371.     Text( MainWnd->RPort, TOC_CDTitle, (slen>29)? 29:slen );
  372.  
  373.     ActTitle = 0;
  374.     }
  375.  
  376.  
  377. void SCMD_ReadTOC ( void )
  378.     {
  379.     static SCSICMD10 command =
  380.         {
  381.         SCSI_CMD_READTOC,
  382.         0,
  383.         PAD, PAD, PAD, PAD,
  384.         0,
  385.         0x03, 0x24,
  386.         PAD
  387.         };
  388.  
  389.     int err, tocsize;
  390.     int i;
  391.     UBYTE *tocptr;
  392.     char Buffer[130];
  393.     BPTR FH;
  394.     char *a;
  395.  
  396.     if ((err = DoScsiCmd ((UBYTE *) toc_buf, MAX_TOC_LEN,
  397.            (UBYTE *) & command, sizeof (command),
  398.            (SCSIF_READ | SCSIF_AUTOSENSE))) == 0)
  399.         {
  400.         SetAPen( MainWnd->RPort, 1 );
  401.         RectFill( MainWnd->RPort, 25, 38+offy, 258, 64+offy );
  402.  
  403.         tocsize = (toc_buf[0] << 8) | toc_buf[1];     /* first word encodes length */
  404.  
  405.         /* TOC_NumTracks = toc_buf[3]; */
  406.         TOC_Addr[2] = 0;
  407.         TOC_NumTracks = 0;
  408.         if (tocsize >= 2)  /* TOC Data Length - FTN - LTN */
  409.        tocsize -= 2;
  410.         for (tocptr = &toc_buf[4]; tocptr < (&toc_buf[4] + tocsize); tocptr += 8)
  411.        {
  412.             TOC_Addr[TOC_NumTracks] = (tocptr[4] << 24) | (tocptr[5] << 16) | (tocptr[6] << 8) | (tocptr[7]);
  413.        /* printf ("Track number: %d ", tocptr[2]); */
  414.        TOC_Flags[TOC_NumTracks] = (tocptr[1] & 0x04) ? 1 : 0;
  415.             TOC_NumTracks++;
  416.        }
  417.         TOC_NumTracks--;
  418.  
  419.         if (TOC_NumTracks<=20) RectFill( MainWnd->RPort, 165-7*(20-TOC_NumTracks), 65+offy, 190, 72+offy );
  420.  
  421.         SetAPen( MainWnd->RPort, 2 );
  422.         SetBPen( MainWnd->RPort, 1 );
  423.  
  424.         sprintf(Buffer, "%02d", TOC_Addr[TOC_NumTracks]/75/60 );
  425.    Move( MainWnd->RPort, 212, 37+offy );
  426.    Text( MainWnd->RPort, Buffer, 2 );
  427.  
  428.         sprintf(Buffer, "%02d", (TOC_Addr[TOC_NumTracks]/75)%60 );
  429.    Move( MainWnd->RPort, 231, 37+offy );
  430.    Text( MainWnd->RPort, Buffer, 2 );
  431.  
  432.         sprintf( TOC_CDID, "ID%02d%06X%06X", TOC_NumTracks, TOC_Addr[2], TOC_Addr[TOC_NumTracks] );
  433.  
  434.         sprintf( Buffer, SongPath );
  435.         AddPart( Buffer, TOC_CDID, 130 );
  436.  
  437.         if (FH = Open( Buffer, MODE_OLDFILE ))
  438.             {
  439.             Read( FH, TOC_TitleStrs, 4000 );
  440.             Close( FH );
  441.             a = TOC_TitleStrs;
  442.             TOC_CDInterpret = a;
  443.             a = GetNextStr( a );
  444.             TOC_CDTitle = a;
  445.             for (i=0; i<TOC_NumTracks; i++)
  446.                 {
  447.                 a = GetNextStr( a );
  448.                 TOC_Title[i] = a;
  449.                 };
  450.             a = GetNextStr( a );
  451.             }
  452.         else
  453.             {
  454.             a = TOC_TitleStrs;
  455.             strcpy( a, "<Unknown CD>" );
  456.             TOC_CDTitle = a;
  457.             a += strlen( a ) + 1;
  458.             strcpy( a, TOC_CDID );
  459.             TOC_CDInterpret = a;
  460.             a += strlen( a ) + 1;
  461.             for (i=0; i<TOC_NumTracks; i++)
  462.                 {
  463.                 strcpy( a, "<Unknown Title>" );
  464.                 TOC_Title[i] = a;
  465.                 a += strlen( a ) + 1;
  466.                 };
  467.             };
  468.         ShowCDTitle();
  469.         GetProgram();
  470.         if (Program[0][0]==0) ActProg = -1;
  471.         }
  472.     }
  473.  
  474. void SCMD_Jump( int blocks )
  475.     {
  476.     static SCSICMD10 command1 =
  477.         {
  478.         SCSI_CMD_READSUBCHANNEL,
  479.         0,
  480.         0x40,
  481.         0,
  482.         PAD,
  483.         PAD,
  484.         0,
  485.         0,0,
  486.         PAD
  487.         };
  488.  
  489.     static SCSICMD12 command2 =
  490.         {
  491.         SCSI_CMD_PLAYAUDIO12,
  492.         PAD,
  493.         0, 0, 0, 0,
  494.         0, 0, 0, 0,
  495.         PAD,
  496.         PAD,
  497.         };
  498.  
  499.     int err;
  500.     int addr;
  501.  
  502.     command1.b2 = 0x40;
  503.     command1.b3 = 1;
  504.     command1.b6 = 0;
  505.  
  506.     command1.b7 = 255;
  507.     command1.b8 = 255;
  508.  
  509.     if ((err = DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
  510.                           (UBYTE *) &command1, sizeof (command1),
  511.                           (SCSIF_READ | SCSIF_AUTOSENSE))) == 0)
  512.         {
  513.       if (NewTimer)
  514.          addr = (scsi_data[12] << 24) | (scsi_data[11] << 16) | (scsi_data[10] << 8) | (scsi_data[9]);
  515.       else
  516.          addr = ((scsi_data[8] << 16) | (scsi_data[9] << 16) | (scsi_data[10] << 8) | (scsi_data[11]) );
  517.  
  518.         addr += blocks;
  519.  
  520.         if ((addr>=TOC_Addr[ActTitle-1])&&(addr<TOC_Addr[ActTitle]))
  521.             {
  522.             command2.b2 = (addr&0xFF000000)>>24;
  523.             command2.b3 = (addr&0x00FF0000)>>16;
  524.             command2.b4 = (addr&0x0000FF00)>>8;
  525.             command2.b5 = (addr&0x000000FF);
  526.  
  527.             if (ActProg == -1)
  528.                 {
  529.                 addr = TOC_Addr[TOC_NumTracks]-TOC_Addr[ActTitle-1]-1;
  530.                 }
  531.             else addr = TOC_Addr[ActTitle]-TOC_Addr[ActTitle-1]-1;
  532.  
  533.             command2.b6 = (addr&0xFF000000)>>24;
  534.             command2.b7 = (addr&0x00FF0000)>>16;
  535.             command2.b8 = (addr&0x0000FF00)>>8;
  536.             command2.b9 = (addr&0x000000FF);
  537.  
  538.             DoScsiCmd ((UBYTE *) scsi_data, MAX_DATA_LEN,
  539.                        (UBYTE *) & command2, sizeof (command2),
  540.                        (SCSIF_READ | SCSIF_AUTOSENSE));
  541.             }
  542.         }
  543.     }
  544.  
  545.  
  546.